﻿#pragma once
#include <vector>
using namespace std;

/*
假设把某股票的价格按照时间先后顺序存储在数组中，请问买卖该股票一次可能获得的最大利润是多少？

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

class MaxProfit63 {
public:
    int maxProfit_1(vector<int>& prices) {
        if (prices.size() < 2) {
            return 0;
        }

        int profit = 0;
        int buy = *(prices.begin());
        for (vector<int>::iterator it = prices.begin() + 1; it != prices.end(); it++) {
            if (*it - buy > profit) {
                profit = *it - buy;
            } else if(*it < buy){
                buy = *it;
            }
        }

        return profit;
    }

    void test() {
        vector<int> in63_1 = { 7,1,5,3,6,4 };
        int res = this->maxProfit_1(in63_1);
        _ASSERT(res == 5);

        vector<int> in63_2 = { 7,6,4,3,1 };
        res = this->maxProfit_1(in63_2);
        _ASSERT(res == 0);

        vector<int> in63_3 = { 7,9 };
        res = this->maxProfit_1(in63_3);
        _ASSERT(res == 2);

        vector<int> in63_4 = { 7,7 };
        res = this->maxProfit_1(in63_4);
        _ASSERT(res == 0);

        vector<int> in63_5 = { 7,2,9};
        res = this->maxProfit_1(in63_5);
        _ASSERT(res == 7);

        vector<int> in63_6 = { 7,6,4,3,1,9 };
        res = this->maxProfit_1(in63_6);
        _ASSERT(res == 8);

        vector<int> in63_7 = { 11,16,4,33,1,9 };
        res = this->maxProfit_1(in63_7);
        _ASSERT(res == 29);
    }
};